#!/bin/bash

#net_speed.sh

# about
# 此shell用于显示实时网速
# author:masterc
# date:2021.03.19
# version:1.0

# 如需开启DEBUG,给DEBUG赋任意值即可
DEBUG=

# 计算网速
function getRate(){
    rate=$1
    result="${rate}"
    if [ ${rate} -gt 1024 ];then
        rate=`expr ${rate} / 1024`
        rate_p=`expr ${rate} % 1024`
        result="${rate}.${rate_p}"
    fi
    echo $result
}
# 计算量程
function getUnit(){
    rate=$1
    result="KB/s"
    if [ $rate -gt 1024 ];then
      result="MB/s"
    fi
    echo $result
}

function main(){
    # 要监听的网卡
    net_card=$1

    if [ ! $net_card ];then
        echo "net card is not selected!"
    else
        echo "net card:$net_card"
    fi

    #初始化
    # awk 'NR==8{print}' : 取ifconfig结果的第8行,可根据ifconfig结果做具体调整
    # awk -F '[(:]' '{print $4}' : 取上传字节数
    # awk -F '[(:]' '{print $2}' : 取下载字节数
    # up_rate1=`ifconfig $net_card | awk 'NR==8{print}' | awk -F '[(:]' '{print $4}'`
    # down_rate1=`ifconfig $net_card | awk 'NR==8{print}' | awk -F '[(:]' '{print $2}'`
    up_rate1=`ifconfig $net_card | awk 'NR==7{print}' | awk '{print $5}'`
    down_rate1=`ifconfig $net_card | awk 'NR==5{print}' | awk '{print $5}'`
    up_rate2=0
    down_rate2=0

    while true
    do
        sleep 1

        # up_rate2=`ifconfig $net_card | awk 'NR==8{print}' | awk -F '[(:]' '{print $4}'`
        # down_rate2=`ifconfig $net_card | awk 'NR==8{print}' | awk -F '[(:]' '{print $2}'`
        up_rate2=`ifconfig $net_card | awk 'NR==7{print}' | awk '{print $5}'`
        down_rate2=`ifconfig $net_card | awk 'NR==5{print}' | awk '{print $5}'`
        # DEBUG
        if [ $DEBUG ];then
            echo "up_rate1:${up_rate1},down_rate1:${down_rate1}"
            echo "up_rate2:${up_rate2},down_rate2:${down_rate2}"
        fi

        # 取差值
        up_rate=`expr $up_rate2 - $up_rate1`
        down_rate=`expr $down_rate2 - $down_rate1`

        # 记录旧值
        up_rate1=$up_rate2
        down_rate1=$down_rate2

        # 单位转换 B -> KB
        up_rate=`expr $up_rate / 1024`
        down_rate=`expr $down_rate / 1024`
        
        # \r用于每次输出后将光标重新定位到开头
        printf "\r[UP:%6.1f %s,DOWN:%6.1f %s]" `getRate $up_rate` `getUnit $up_rate` `getRate $down_rate` `getUnit $down_rate`
    done
}
main $@